package org.projetjava.metier.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.projetjava.metier.model.*;





public class LieuDao extends Bdd{

	private Connection con;
	
	private PreparedStatement prepStatRechNomExact = null;
	private PreparedStatement prepStatRechPartieNom = null;
	private PreparedStatement prepStatRechNomDescription = null;
	private PreparedStatement prepStatLieu = null;
	private PreparedStatement prepStatLieuImageLieu = null;
	private PreparedStatement prepStatAjoutLieu = null;
	private PreparedStatement prepStatIdDerniereLieu = null;
	private PreparedStatement prepStatAjoutImagesLieu = null;
	private PreparedStatement prepStatModifierLieu = null;
	private PreparedStatement prepStatSupprImagesLieu = null;
	private PreparedStatement prepStatSupprHyperTextLieu = null;
	private PreparedStatement prepStatSupprLieu = null;
	private PreparedStatement prepStatListLieu = null;
	private PreparedStatement prepStatListAllLieu = null;

	
	public LieuDao()
	{
		super();
		this.con = this.getConnection();
	}
	
	public int ajouter(Lieu lieu)
	{
		
		try {
			if(this.prepStatAjoutLieu == null)
			{
				this.prepStatAjoutLieu = this.con.prepareStatement("INSERT INTO Lieu(Image_Lieu, Texte_Description_Lieu, Libelle_Lieu) VALUES (?,?,?)");
			}
			if(this.prepStatIdDerniereLieu == null)
			{
				this.prepStatIdDerniereLieu = this.con.prepareStatement("SELECT Max(ID_Lieu) FROM Lieu");
			}
			if(this.prepStatAjoutImagesLieu == null)
			{
				this.prepStatAjoutImagesLieu = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_Lieu) VALUES (?,?)");
			}
			
			this.prepStatAjoutLieu.setString(1, lieu.getImage());
			this.prepStatAjoutLieu.setString(2, lieu.getDescription());
			this.prepStatAjoutLieu.setString(3, lieu.getLibelle());
			this.prepStatAjoutLieu.executeUpdate();
			
			
			
			//execution
			ResultSet resultId = this.prepStatIdDerniereLieu.executeQuery();
			int idLieu = 0;
			//boucle sur result
			while(resultId.next()){   
				//1 er résultat
				if(resultId.first())
				{
					idLieu = (int) resultId.getObject(1);
				}
			}

			//list hypertext
			HyperTextDao daoHypertext = new HyperTextDao();
			daoHypertext.AjoutHyperTextLieu(lieu,idLieu);
			
			//Ajout IMAGES
			for(String list : lieu.getLienImages())
			{
				this.prepStatAjoutImagesLieu.setString(1, list);
				this.prepStatAjoutImagesLieu.setInt(2, idLieu);
				this.prepStatAjoutImagesLieu.executeUpdate();
			}
			
			//AJOUT POI
			PoiDao daoPoi = new PoiDao();
			daoPoi.ajouter(lieu,idLieu);

		
		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	public int modifier(Lieu lieu)
	{
		try {
		
			//modifier poi
			PoiDao daoPoi = new PoiDao();
			daoPoi.modifier(lieu,lieu.getId());
			
			if(this.prepStatModifierLieu == null)
			{
				this.prepStatModifierLieu = this.con.prepareStatement("UPDATE Lieu SET Image_Lieu=?,Texte_Description_Lieu=?,Libelle_Lieu=? WHERE ID_Lieu = ?");
			}
			this.prepStatModifierLieu.setString(1, lieu.getImage().toString());
			this.prepStatModifierLieu.setString(2, lieu.getDescription().toString());
			this.prepStatModifierLieu.setString(3, lieu.getLibelle().toString());
			this.prepStatModifierLieu.setInt(4, lieu.getId());
			this.prepStatModifierLieu.executeUpdate();
			
			if(this.prepStatSupprImagesLieu == null)
			{
				this.prepStatSupprImagesLieu= this.con.prepareStatement("DELETE FROM Images WHERE ID_Lieu = ?");
			}
			this.prepStatSupprImagesLieu.setInt(1, lieu.getId());
			this.prepStatSupprImagesLieu.executeUpdate();
		
			//delete hypertext
			if(this.prepStatSupprHyperTextLieu == null)
			{
				this.prepStatSupprHyperTextLieu= this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Lieu = ?");
			}
			this.prepStatSupprHyperTextLieu.setInt(1, lieu.getId());
			this.prepStatSupprHyperTextLieu.executeUpdate();
			
			//list hypertext
			HyperTextDao daoHypertext = new HyperTextDao();
			daoHypertext.AjoutHyperTextLieu(lieu,lieu.getId());
			
			//Ajout IMAGES
			if(this.prepStatAjoutImagesLieu == null)
			{
				this.prepStatAjoutImagesLieu = this.con.prepareStatement("INSERT INTO Images(Lien_Images, ID_Lieu) VALUES (?,?)");
			}
			
			for(String list : lieu.getLienImages())
			{
				this.prepStatAjoutImagesLieu.setString(1, list);
				this.prepStatAjoutImagesLieu.setInt(2, lieu.getId());
				this.prepStatAjoutImagesLieu.executeUpdate();
			}
			
			
		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	public int supprimer(Lieu lieu)
	{
		try {
			
			//suppr poi
			PoiDao daoPoi = new PoiDao();
			daoPoi.supprimer(lieu);
			
			if(this.prepStatSupprImagesLieu == null)
			{
				this.prepStatSupprImagesLieu= this.con.prepareStatement("DELETE FROM Images WHERE ID_Lieu = ?");
			}
			this.prepStatSupprImagesLieu.setInt(1, lieu.getId());
			this.prepStatSupprImagesLieu.executeUpdate();
		
			//delete hypertext
			if(this.prepStatSupprHyperTextLieu == null)
			{
				this.prepStatSupprHyperTextLieu= this.con.prepareStatement("DELETE FROM LienHyperText WHERE ID_Lieu = ?");
			}
			this.prepStatSupprHyperTextLieu.setInt(1, lieu.getId());
			this.prepStatSupprHyperTextLieu.executeUpdate();
			
			if(this.prepStatSupprLieu == null)
			{
				this.prepStatSupprLieu= this.con.prepareStatement("DELETE FROM Lieu WHERE ID_Lieu = ?");
			}
			this.prepStatSupprLieu.setInt(1, lieu.getId());
			this.prepStatSupprLieu.executeUpdate();
			
		} catch (SQLException e) { 
			e.printStackTrace();
			return 1;
	    }
		return 0;
	}
	
	
	public List<String> rechercheParNomExact(String recherche){
		List<String> listResultat = new ArrayList<>();
			try {
			
				if(this.prepStatRechNomExact == null)
				{
					this.prepStatRechNomExact = this.con.prepareStatement("SELECT Libelle_Lieu FROM Lieu WHERE Libelle_Lieu = ?");
				}
				
				this.prepStatRechNomExact.setString(1, recherche);
			     
			    //L'objet ResultSet contient le r�sultat de la requ�te SQL
			    ResultSet result = this.prepStatRechNomExact.executeQuery();
			      
			      
			     
			    while(result.next()){         
			    	listResultat.add(result.getObject(1).toString());
			    }
	
			    result.close();
		         
			} catch (SQLException e) { 
				e.printStackTrace();
		    }
		return listResultat;
	}
	
	public List<String> rechercheParNom(String recherche)
	{
		String like = "%" + recherche + "%";  
		List<String> listResultat = new ArrayList<>();
		
		try {
		
			if(this.prepStatRechPartieNom == null)
			{
				this.prepStatRechPartieNom = this.con.prepareStatement("SELECT Libelle_Lieu FROM Lieu WHERE Libelle_Lieu LIKE ?");
			}
			
			this.prepStatRechPartieNom.setString(1, like);
		     
		    //L'objet ResultSet contient le r�sultat de la requ�te SQL
		    ResultSet result = this.prepStatRechPartieNom.executeQuery();

		    while(result.next()){         
		    	listResultat.add(result.getObject(1).toString());
		    }

		    result.close();
	         
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	  return listResultat;
		
	}
	
	public List<String> rechercheParLibelleDescription(String recherche)
	{
		String like = "%" + recherche + "%"; 
		List<String> listResultat = new ArrayList<>();
		
		try {
		
			if(this.prepStatRechNomDescription == null)
			{
				this.prepStatRechNomDescription = this.con.prepareStatement("SELECT Libelle_Lieu FROM Lieu WHERE Libelle_Lieu LIKE ? OR Texte_Description_Lieu LIKE ?");
			}
			
			this.prepStatRechNomDescription.setString(1, like);
			this.prepStatRechNomDescription.setString(2, like);
		     
		    //L'objet ResultSet contient le r�sultat de la requ�te SQL
		    ResultSet result = this.prepStatRechNomDescription.executeQuery();

		    while(result.next()){         
		    	listResultat.add(result.getObject(1).toString());
		    }

		    result.close();
	         
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
	  return listResultat;
		
	}
	
	
	
	public Lieu selectionLieu(String libelle)
	{
		Lieu lieu = null;
		try {
			
			if(this.prepStatLieu == null)
			{
				this.prepStatLieu = this.con.prepareStatement("SELECT Image_Lieu, Texte_Description_Lieu,ID_Lieu FROM Lieu WHERE Libelle_Lieu = ?");
			}
			this.prepStatLieu.setString(1, libelle);
			ResultSet resultLieu = this.prepStatLieu.executeQuery();
			while(resultLieu.next()){
				
				//lieu
				lieu = new Lieu();
				
				lieu.setImage(resultLieu.getObject(1).toString());
				lieu.setDescription(resultLieu.getObject(2).toString());
				lieu.setLibelle(libelle);
				lieu.setId((int) resultLieu.getObject(3));

				List<Poi> listPoi = new ArrayList<>();
				
				PoiDao poi = new PoiDao();
				listPoi = poi.SelectPoiLieu((int) resultLieu.getObject(3));
				
				lieu.setListPoi(listPoi);
				
				//hypertext
				HyperTextDao daoHypertext = new HyperTextDao();
				lieu.setLienHyperText(daoHypertext.SelectHyperTextLieu((int) resultLieu.getObject(3)));
			

				//images
				List<String> listImage = new ArrayList<>();
				if(this.prepStatLieuImageLieu == null)
				{
					this.prepStatLieuImageLieu = this.con.prepareStatement("SELECT Lien_Images FROM `Images` WHERE ID_Lieu =?");
				}
				
				//argument
				this.prepStatLieuImageLieu.setInt(1, (int) resultLieu.getObject(3));
				
				//on stock dans le resultLienImage
				ResultSet resultLienImage = this.prepStatLieuImageLieu.executeQuery();
				while(resultLienImage.next()){
					listImage.add(resultLienImage.getObject(1).toString());
				}
				lieu.setLienImages(listImage);
				
				
				
				
			}
		
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return lieu;
	}
	
	
	public List<Lieu> ObtenirListLieuxParcours(int idParcours)
	{
		List<Lieu> listLieu = new ArrayList<>();
		try {
			if(this.prepStatListLieu == null)
			{
				this.prepStatListLieu = this.con.prepareStatement("SELECT DISTINCT L.ID_Lieu, L.Texte_Description_Lieu, L.Libelle_Lieu FROM Parcours P, ParcoursContient PC, Lieu L, POI PO WHERE PO.ID_Lieu = L.ID_Lieu AND PC.ID_POI = PO.ID_POI AND P.ID_Parcours = ? AND PC.ID_Parcours = ?");
			}
			this.prepStatListLieu.setInt(1, idParcours);
			this.prepStatListLieu.setInt(2, idParcours);
			ResultSet resultLieu = this.prepStatListLieu.executeQuery();
			while(resultLieu.next()){
				Lieu lieu = new Lieu();
				lieu.setId((int) resultLieu.getObject(1));
				lieu.setDescription(resultLieu.getObject(2).toString());
				lieu.setLibelle(resultLieu.getObject(3).toString());
				listLieu.add(lieu);
			}
		
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return listLieu;
	}
	
	
	public List<String> ListLieu()
	{
		List<String> listLieu = new ArrayList<>();
		
		try {
			if(this.prepStatListAllLieu == null)
			{
				this.prepStatListAllLieu = this.con.prepareStatement("SELECT Libelle_Lieu FROM Lieu");
			}
			ResultSet resultLieu = this.prepStatListAllLieu.executeQuery();
			while(resultLieu.next()){
				listLieu.add(resultLieu.getObject(1).toString());
			}
			
		} catch (SQLException e) { 
			e.printStackTrace();
	    }
		
		return listLieu;
	}

}
